//Symbol 补充

// console.log(
//     Symbol() === Symbol(), //false
//     Symbol("foo") === Symbol("foo")//false
// )
//通过Symbol函数创建的值都是唯一，不管我们的传入的描述文本是不是相同的，每次调用Symbol函数得到的结构都是全新的一个值。
//假如我们想在全局去复用一个相同的Symbol值，我们可以使用全局变量的方式去实现或者使用Symbol类型提供的静态方法去实现。

// for方法可以接受一个字符串作为参数，相同的字符串返回相同的Symbol类型的值。这个方法内部维护了一个全局的注册表，为字符串和Symbol值提供了一个一一对应的关系
// const s1 =  Symbol.for("foo")
// const s2 =  Symbol.for("foo")
// console.log(
//     s1 === s2 //true
// )

//注意： for方法内部维护的是字符串和Symbol对应的关系，如果我们传入的不是字符串，这个方法内部会把它转化为字符串。这样就会导致我们传入布尔值的true和字符串的 "true"结果拿到的是一样的。

// console.log(
//     Symbol.for(true) === Symbol.for("true")//true
// )

//在Symbol类型当中还提供了很多内置的Symbol常量，用来作为内部方法的标识。这些标识符可以让自定义对象实现一些js当中内置的接口
// console.log(Symbol.iterator)
// console.log(Symbol.hasInstance)

//自定义对象的toString标签
// const obj = {
//     //如果使用字符串标签去添加标识符，有可能会和内部的成员产生重复,ECMAScript要求我们使用Symbol去实现这个的一个接口
//     [Symbol.toStringTag]:"xObject"
// }
// console.log(obj.toString())//[object xObject] 

const obj = {
    [Symbol()]:"symbol value",
    foo:123
}
for(let val in obj){
    console.log(val) //foo
}
console.log(Object.keys(obj))//[ 'foo' ]
console.log(JSON.stringify(obj))//{"foo":123}
//使用Symbol值作为对象的属性名，通过传统的for in 循环和Object.keys是无法拿到的。通过JSON.stringify去序列化对象为一个JSON字符串Symbol属性也是会忽略掉。
//通过以上三种方法都无法获取Symbol属性创建的值，这些特性使得Symbol类型的属性特别适合作为对象的私有属性。

//如果想获取对象的Symbol属性也不是没有办法，我们可以使用Object.getOwnPropertySymbols方法，类似于对象的Object.keys(）方法。
//Object.keys()方法只能够获取到对象中所有的字符串属性名
//Object.getOwnPropertySymbols()获取的是Symbol类型的属性名
console.log(Object.getOwnPropertySymbols(obj))//[ Symbol() ]